// 返回合并的数据，如[2, 0, 2, 0]
const getSpanArr = (tableData, prop) => {
  const spanArr = [] // 控制合并的数组
  let index = 0 // 设置索引
  const values = tableData.map((v) => v[prop])
  // 将 ['1001', '1001', '1002', '1002'] 转换为 [2, 0, 2, 0]
  values.reduce((old, cur, i) => {
    if (cur === old) {
      spanArr[index] += 1
      spanArr.push(0)
    } else {
      spanArr.push(1)
      index = i
    }
    return cur
  }, "")
  return spanArr
}
/*
  根据prop属性，合并内容相同的行
  
  入参：
    1. el-table span-method属性自带的{ row, column, rowIndex, columnIndex }
    2. 数据源：tableData，数组，必传
    3. 需要合并的列：mergeList，数组，必传
    4. 是否需要根据前一列来合并当前列：isRely，布尔值，默认true，选传
*/

const separator = "****" // 分隔符
export const mergeRowByProp = ({ row, column, rowIndex, columnIndex }, tableData, mergeList, isRely = true) => {
  // 如果合并的列数大于1，需要对数据进行改造，使后面的列依赖于前面的列
  if (isRely && mergeList.length > 1) {
    tableData = JSON.parse(JSON.stringify(tableData))
    tableData.forEach((item) => {
      mergeList.forEach((m, i) => {
        const { prop } = m
        if (i) {
          // 当前列的内容拼接上前一列的内容，使用分隔符隔开
          // 分隔符的作用只是为了打印数据时看的方便点，加不加都行
          item[prop] = `${item[mergeList[i - 1].prop]}${separator}${item[mergeList[i].prop]}`
        }
      })
    })
  }
  for (const { column, prop } of mergeList) {
    if (columnIndex === column) {
      const spanArr = getSpanArr(tableData, prop)
      const rowspan = spanArr[rowIndex]
      const colspan = rowspan > 0 ? 1 : 0
      return { rowspan, colspan }
    }
  }
}
